package com.ds.robot.assistant.service;

import lombok.extern.slf4j.Slf4j;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 作用：测试线程池 ScheduledExecutorService方式
 *
 * @author WeiShaoying
 * 
 */
@Slf4j
public class DutyReminder {


    public static void main(String[] args) {
        String filePath = "D:\\projects\\renkang-robot\\src\\main\\resources\\duty.txt";
        // 读取文件并解析时间与人名
        Map<LocalDateTime, String> dutySchedule = readDutySchedule(filePath);

        // 当前线程的默认时区
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        // 创建一个定时执行器
        ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();

        for (Map.Entry<LocalDateTime, String> entry : dutySchedule.entrySet()) {
            LocalDateTime dutyTime = entry.getKey();
            String personName = entry.getValue();

            // 从现在到值班时间的间隔
            long initialDelay = dutyTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() - System.currentTimeMillis();

            // 如果延迟为负，说明值班时间已过，跳过
            if (initialDelay < 0) {
                log.info("{} 的值班时间已过", personName);
                continue;
            }
            // 安排任务在指定时间执行
            executor.schedule(() -> {
                log.info("============{} ： {} 今天该你值班了", formatter.format(LocalDateTime.now()), personName);
            }, initialDelay, TimeUnit.MILLISECONDS);
        }


        // 关闭定时执行器，不会立即关闭，因为它需要一直运行以等待调度的任务
        // 在实际应用中，你可能需要考虑如何优雅地关闭scheduler，比如添加shutdown hook或在所有任务执行完毕后调用shutdown()
        // executor.shutdown();
        //
        // try {
        //     // 等待一段时间让所有任务完成，这里是等待最多60秒
        //     if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
        //         log.warn("Executor did not terminate in the specified time.");
        //         // 如果到了超时时间还有任务没完成，可以选择强制关闭
        //         executor.shutdownNow();
        //     } else {
        //         log.info("Executor terminated gracefully.");
        //     }
        // } catch (InterruptedException e) {
        //     // 处理中断异常，如果当前线程等待时被中断，则取消等待并关闭执行器
        //     executor.shutdownNow();
        //     Thread.currentThread().interrupt();
        // }

    }

    private static Map<LocalDateTime, String> readDutySchedule(String filePath) {
        Map<LocalDateTime, String> schedule = new ConcurrentHashMap<>();
        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = br.readLine()) != null) {
                String[] parts = line.trim().split(",");
                if (parts.length == 2) {
                    LocalDateTime time = LocalDateTime.parse(parts[0], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
                    String name = parts[1];
                    schedule.put(time, name);
                } else {
                    log.info("忽略无效行: " + line);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return schedule;
    }
}
